iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 16
0

演變

在 Android 3.0 之前,通知是使用 Notification() 來達成

val notification = Notification(icon, tickerText, when)

在 Android 3.0 以後,使用 Notification.Builder 執行通知

val notification = Notification.Builder(context)

所以後來為了兼容之前的版本,新增了 NotificationCompat.Builder 來執行通知

val notification = NotificationCompat.Builder(context)

另外,在 Android API level 26.1.0 只傳入 context 的建構子已被棄用,新的建構子還需多傳入 channel Id

val notification = NotificationCompat.Builder(context, channelId)

Android 8.0 前使用方式

要成功顯示出通知

  1. 首先需要建立一 NotificationManager 物件
  2. 建立一 Builder ,並將細節的屬性設置添加給上去
  3. 呼叫 Builder.build() 得到 Notification 物件
  4. NotificationManager 執行 notify 方法執行通知

如果在 Android 4.4 版本以上設定 setLargeIcon 時使用 BitmapFactory.decode 來提供 Bitmap 的話
傳入的資源檔如果是 vector ,則 bitmap 會回傳 null,造成圖案無法顯示;建議直接使用 jpeg 或 png 等圖檔

val notificationManager =
        getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

val builder =
    NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_star_black_24dp)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        
val notificationId = 1
val notification = builder.build()

notificationManager.notify(notificationId, notification)

Android 8.0 後使用方式

在 Android 8.0 後,除了原本的動作還 "必須" 建立一個 NotificationChannel 並使用 createNotificationChannel() 方法指定給 NotificationManager

要注意在建立 Builder 時傳入的參數 "channelId" 要與建立的 NotificationChannel 物件帶入的第一個參數一致,這樣才能對應的上

val builder =
    NotificationCompat.Builder(this, "channel01")
        .setSmallIcon(R.drawable.ic_star_black_24dp)
        .setContentTitle("My notification")
        .setContentText("Hello World")
        .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
        .setVibrate(longArrayOf(300, 600, 300, 600))
        .setLights(Color.GREEN, 1000, 1000)
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)

val channel = NotificationChannel(
    "channel01",
    "MyChannel",
    NotificationManager.IMPORTANCE_HIGH
)

val notificationId = 1
val notification = builder.build()
notificationManager.createNotificationChannel(channel)
notificationManager.notify(notificationId, notification)

點擊操作

在按下通知欄的通知時,我們可能會希望可以跳轉到某一個 Activity
這時候可以使用 PendingIntent 來達成

val intent = Intent(this, MainActivity::class.java)
val pendingIntent =
    PendingIntent.getActivity(
        this,
        0,
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT)

接著在 Builder 建立時呼叫 setContentIntent 方法

 val builder =
            NotificationCompat.Builder(this, "channel01")
                .setSmallIcon(R.drawable.ic_star_black_24dp)
                .setContentTitle("My notification")
                .setContentText("Hello World")
                
                ...
                
                .setContentIntent(pendingIntent)

完整專案可以看 Github 連結


上一篇
Day 15 Ball (Animator)
下一篇
Day 17 PushMessages
系列文
Kotlin and Android 30 days30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言